/**
 * \file Principal.cpp
 * \brief Fichier test pour le dictionnaire
 * \author Pierre-Marc Levasseur, Simon Rodier
 * \version 0.1
 * \date juillet 2014
 */

#include<gtest/gtest.h>
#include<iostream>
#include<fstream>
#include"Dictionnaire.h"

using namespace std;
using namespace TP2P1;

TEST(Dictionnaire, ConstructeurParDefaut_constructionNormale_DictionnaireVide)
{
	Dictionnaire d;

	ASSERT_TRUE(d.estVide());
}

TEST(Dictionnaire, ConstructeurAPartirDunFichier_fonctionneCommeIlFaut)
{
	ifstream f("EnglishFrenchLinux.txt");
	Dictionnaire d(f);

	cout << "Nombre de mots dans le dictionnaire : " << d.nombreDeMot() << endl;
}

TEST(Dictionnaire, AjouteMot_ajouteUnMot_DictionnaireNonVideEtContientLeBonMot)
{
	Dictionnaire d;

	d.ajouteMot("cat", "chat");

	ASSERT_FALSE(d.estVide());
	ASSERT_EQ(1, d.nombreDeMot());
	cout << endl;
	d.afficherSymetrique();
	cout << endl;
}

TEST(Dictionnaire, AjouteMot_ajouteDeuxFoisLeMemeMot_UnSeulMotDansLeDictionnaire)
{
	Dictionnaire d;

	d.ajouteMot("a", "un");
	d.ajouteMot("a", "une");

	ASSERT_FALSE(d.estVide());
	ASSERT_EQ(1, d.nombreDeMot());
	cout << endl;
	d.afficherSymetrique();
	cout << endl;
}

TEST(Dictionnaire, AjouteMot_ajoutDePlusieursMots_DictionnaireNonVideEtBalance)
{
	Dictionnaire d;

	// on fait pencher l'arbre du côté droit pour voir s'il va se balancer
	d.ajouteMot("cat", "chat");
	d.ajouteMot("dog", "chien");
	d.ajouteMot("tree", "arbre");
	d.ajouteMot("zebra", "zebre");

	ASSERT_FALSE(d.estVide());
	ASSERT_EQ(4, d.nombreDeMot());
	cout << endl;
	d.afficherSymetrique();
	cout << endl;
}

TEST(Dictionnaire, AjouteMot_ajoutDePlusieursMots_DictionnaireNonVideEtBalance2)
{
	Dictionnaire d;

	// on fait pencher l'arbre du côté gauche pour voir s'il va se balancer
	d.ajouteMot("zebra", "zebre");
	d.ajouteMot("tree", "arbre");
	d.ajouteMot("dog", "chien");
	d.ajouteMot("cat", "chat");

	ASSERT_FALSE(d.estVide());
	ASSERT_EQ(4, d.nombreDeMot());
	cout << endl;
	d.afficherSymetrique();
	cout << endl;
}

TEST(Dictionnaire, AjouteMot_ajoutDePlusieursMots_DictionnaireNonVideEtBalance3)
{
	Dictionnaire d;

	// ajout de 15 éléments, l'arbre devrait rester balancé
	d.ajouteMot("zebra", "zebre");
	d.ajouteMot("tree", "arbre");
	d.ajouteMot("dog", "chien");
	d.ajouteMot("cat", "chat");
	d.ajouteMot("homework", "devoir");
	d.ajouteMot("sword", "epee");
	d.ajouteMot("movie", "filme");
	d.ajouteMot("bird", "oiseau");
	d.ajouteMot("food", "nourriture");
	d.ajouteMot("computer", "ordinateur");
	d.ajouteMot("black", "noir");
	d.ajouteMot("green", "vert");
	d.ajouteMot("red", "rouge");
	d.ajouteMot("game", "jeu");
	d.ajouteMot("keyboard", "clavier");

	ASSERT_FALSE(d.estVide());
	ASSERT_EQ(15, d.nombreDeMot());
	cout << endl;
	d.afficherSymetrique();
	cout << endl;
}

TEST(Dictionnaire, supprimeMot_supprimeMotDansUnDicitonnaireVide_lanceLogicError)
{
	Dictionnaire d;

	ASSERT_THROW(d.supprimeMot("patate"), logic_error);
}

class DictionnaireTest : public ::testing::Test
{
public:
	DictionnaireTest():d()
	{
		d.ajouteMot("zebra", "zebre");
		d.ajouteMot("tree", "arbre");
		d.ajouteMot("dog", "chien");
		d.ajouteMot("cat", "chat");
		d.ajouteMot("homework", "devoir");
		d.ajouteMot("sword", "epee");
		d.ajouteMot("movie", "filme");
		d.ajouteMot("bird", "oiseau");
		d.ajouteMot("food", "nourriture");
		d.ajouteMot("computer", "ordinateur");
		d.ajouteMot("black", "noir");
		d.ajouteMot("green", "vert");
		d.ajouteMot("red", "rouge");
		d.ajouteMot("game", "jeu");
		d.ajouteMot("keyboard", "clavier");
	}

	Dictionnaire d;
};

TEST_F(DictionnaireTest, supprimeMot_supprimeUnMot_MotPasPresentDansLeDicoEtArbreResteBalance)
{
	d.supprimeMot("zebra");

	ASSERT_FALSE(d.estVide());
	ASSERT_EQ(14, d.nombreDeMot());
	cout << endl;
	d.afficherSymetrique();
	cout << endl;
}

TEST_F(DictionnaireTest, supprimeMot_supprimeUnMot_MotPasPresentDansLeDicoEtArbreResteBalance2)
{
	d.supprimeMot("dog");

	ASSERT_FALSE(d.estVide());
	ASSERT_EQ(14, d.nombreDeMot());
	cout << endl;
	d.afficherSymetrique();
	cout << endl;
}

TEST_F(DictionnaireTest, supprimeMot_supprimeUnMot_MotPasPresentDansLeDicoEtArbreResteBalance3)
{
	d.supprimeMot("black");

	ASSERT_FALSE(d.estVide());
	ASSERT_EQ(14, d.nombreDeMot());
	cout << endl;
	d.afficherSymetrique();
	cout << endl;
}

TEST_F(DictionnaireTest, supprimeMot_supprimeRacine_MotPasPresentDansLeDicoEtArbreResteBalance)
{
	d.supprimeMot("homework");

	ASSERT_FALSE(d.estVide());
	ASSERT_EQ(14, d.nombreDeMot());
	cout << endl;
	d.afficherSymetrique();
	cout << endl;
}

TEST_F(DictionnaireTest, supprimeMot_supprimeUnMotPasPresentDansDico_LanceLogicError)
{
	ASSERT_THROW(d.supprimeMot("patate"), logic_error);
}

TEST_F(DictionnaireTest, appartient_chercheUnMotQuiEstDansLeDico_retourneTrue)
{
	ASSERT_TRUE(d.appartient("keyboard"));
}

TEST_F(DictionnaireTest, appartient_chercheUnMotQuiEstDansLeDico_retourneTrue2)
{
	ASSERT_TRUE(d.appartient("tree"));
}

TEST_F(DictionnaireTest, appartient_chercheUnMotQuiEstDansLeDico_retourneTrue3)
{
	ASSERT_TRUE(d.appartient("black"));
}

TEST_F(DictionnaireTest, appartient_chercheUnMotQuiNEstPasDansLeDico_retourneFalse)
{
	ASSERT_FALSE(d.appartient("patate"));
}







